/**
 * @(#)AdministradorConfiguracionMemoria.java 1/04/2010
 *
 * Copyright (c) 2005-2010 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 1/04/2010 - 03:55:39 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>1/04/2010 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.configuracion.memoria;

import com.psiqueware.alheli.configuracion.AbstractAdministradorConfiguracion;
import com.psiqueware.alheli.configuracion.AdministradorConfiguracion;

import java.util.HashMap;
import java.util.Map;

/**
 * {@link AdministradorConfiguracion} que persiste la informaci&oacute;n en memoria.
 * <br/>Paquete Original: memoria
 * <br/>Nombre  Original: AdministradorConfiguracionMemoria
 * <br/>Oprima para ver : <a href="AdministradorConfiguracionMemoria.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">AngelElectrico</a>
 * @version Revision: 1.1 1/04/2010 03:55:39 PM
 */
public final class AdministradorConfiguracionMemoria extends AbstractAdministradorConfiguracion implements AdministradorConfiguracion
{

    /**
     * {@link Map} de memoria.
     */
    final Map<Long, Map<String, Map<String, String>>> m_memoria = new HashMap<Long, Map<String, Map<String, String>>>();

    /**
     * Constructor de AdministradorConfiguracionMemoria.
     */
    public AdministradorConfiguracionMemoria()
    {

    }


    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param idDominio identificador &uacute;nico del dominio al que pertence el contexto.
     * @param contexto  del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre    del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor     a almacenar.
     */
    public void configura(final Long idDominio, final String contexto, final String nombre, final String valor)
    {
        Map<String, Map<String, String>> mapaDominio = m_memoria.get(idDominio);
        if (null == mapaDominio)
        {
            mapaDominio = new HashMap<String, Map<String, String>>();
            m_memoria.put(idDominio, mapaDominio);
        }

        Map<String, String> mapaContexto = mapaDominio.get(contexto);
        if (null == mapaContexto)
        {
            mapaContexto = new HashMap<String, String>();
            mapaDominio.put(contexto, mapaContexto);
        }

        mapaContexto.put(nombre, valor);
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param contexto del atributo. No puede ser <code>null</code> ni vacio.
     * @param nombre   del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor    a almacenar.
     */
    public void configura(final String contexto, final String nombre, final String valor)
    {
        configura(null, contexto, nombre, valor);
    }

    /**
     * Agrega un atributo de configuraci&oaucte;n.
     *
     * @param nombre del atributo. No puede ser <code>null</code> ni vacio.
     * @param valor  a almacenar.
     */
    public void configura(final String nombre, final String valor)
    {
        configura(null, null, nombre, valor);
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param idDominio       identificador &uacute;nico del dominio al que pertence el contexto.
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     *
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public String busca(final Long idDominio, final String contexto, final String nombre, final String valorPorDefecto)
    {
        String valor = valorPorDefecto;
        Map<String, Map<String, String>> mapaDominio = m_memoria.get(idDominio);
        if (null != mapaDominio)
        {
            Map<String, String> mapaContexto = mapaDominio.get(contexto);
            if (null != mapaContexto)
            {
                mapaContexto = new HashMap<String, String>();
                valor = mapaContexto.get(nombre) == null ? valorPorDefecto : mapaContexto.get(nombre);
            }
        }
        return valor;
    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param contexto        del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     *
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public String busca(final String contexto, final String nombre, final String valorPorDefecto)
    {
        return busca(null, contexto, nombre, valorPorDefecto);

    }

    /**
     * Busca un atributo de  configuraci&oaucte;n.
     *
     * @param nombre          del atributo buscado. No puede ser <code>null</code> ni vacio.
     * @param valorPorDefecto en caso de que el atributo no se haya dado de alta.
     *
     * @return cadena con el valor guardado del atributo; el valorPorDefecto en caso de no tener almacenado ning&uacute;n valor.
     */
    public String busca(final String nombre, final String valorPorDefecto)
    {
        return busca(null, null, nombre, valorPorDefecto);
    }
}

